package com.zshan.clinic.common.util.validate;

/**
 * 验证银行卡号
 * @author lichen
 */
public class BankCardValidator {

    /**
     * 校验银行卡号是否合法（基于 Luhn 算法）
     * @param cardNumber 银行卡号（工资卡号）
     * @return true 合法，false 非法
     */
    public static boolean isValidBankCard(String cardNumber) {
        if (cardNumber == null || !cardNumber.matches("\\d+")) {
            return false; // 必须是纯数字
        }
        int length = cardNumber.length();
        if (length < 16 || length > 19) {
            return false; // 长度不合法（一般为 16~19 位）
        }
        return luhnCheck(cardNumber);
    }

    /**
     * Luhn 算法校验银行卡号
     */
    private static boolean luhnCheck(String cardNumber) {
        int sum = 0;
        boolean shouldDouble = false;

        // 从右往左遍历
        for (int i = cardNumber.length() - 1; i >= 0; i--) {
            int digit = Character.getNumericValue(cardNumber.charAt(i));
            if (shouldDouble) {
                digit *= 2;
                if (digit > 9) {
                    digit -= 9;
                }
            }
            sum += digit;
            shouldDouble = !shouldDouble;
        }
        return sum % 10 == 0;
    }

    // ========== 示例测试 ==========
    public static void main(String[] args) {
        String card1 = "6217000010091936958";     // 工商银行（真实结构）
        String card2 = "6228480402637874216";  // 农业银行（真实结构）
        String card3 = "1234567890123456";     // 明显错误

        System.out.println("卡号1是否合法: " + isValidBankCard(card1)); // 应输出 true
        System.out.println("卡号2是否合法: " + isValidBankCard(card2)); // 应输出 true
        System.out.println("卡号3是否合法: " + isValidBankCard(card3)); // 应输出 false
    }

}

